home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 2: Applications / Linux Cubed Series 2 - Applications.iso / math / gle-3.000 / gle-3 / gle / token.c < prev    next >
C/C++ Source or Header  |  1995-02-07  |  4KB  |  170 lines

  1. #include "all.h"
  2.  
  3. int token_init(void);
  4. int subscript(void);
  5.  
  6. #define true (!false)
  7. #define false 0
  8. #define add_tok(pp1,n) \
  9.     (*ntok)++; \
  10.     (*tok)[*ntok] = outbuff; \
  11.     for (tj=0;tj<n;tj++) { \
  12.         if (in_quote) *(outbuff+tj) = *(pp1+tj);\
  13.         else *(outbuff+tj) = toupper(*(pp1+tj)); \
  14.         if (*(outbuff+tj) == '"') if (*(outbuff+tj-1) != '\\') { \
  15.             if (in_quote==true) in_quote = false; \
  16.             else in_quote = true; \
  17.         } \
  18.     } \
  19.     in_quote = false; \
  20.     outbuff = outbuff + (n); \
  21.     *(outbuff++) = '\0';
  22. static char term_table1[256];
  23. static char term_table2[256];
  24. static char term_table3[256];
  25. static char *term_table;
  26. static int table_loaded;
  27. char *find_non_term();
  28. char *find_non_space();
  29. char *find_term();
  30. int in_quote;
  31. int spmode;
  32. /* typedef char (*(*TOKENS)[500]);  */
  33.  
  34. /*--------------------------------------------------------------------------*/
  35.  
  36. token_norm()
  37. {
  38.     if (table_loaded==false) token_init();
  39.     term_table = &term_table1[0];
  40.     spmode = false;
  41. }
  42. token_space()
  43. {
  44.     if (table_loaded==false) token_init();
  45.     term_table = &term_table2[0];
  46.     spmode = true;
  47. }
  48. token_equal()
  49. {
  50.     if (table_loaded==false) token_init();
  51.     term_table = &term_table3[0];
  52.     spmode = false;
  53. }
  54. token_init()
  55. {
  56.     int i;
  57.     term_table = &term_table1[0];
  58.     table_loaded = true;
  59.     {auto char *termset="     ,-+*)(<>=/!^@";
  60.     for (i=0;i<=255;i++) {
  61.         if (strchr(termset,i)!=NULL) {
  62.             term_table1[i]=true;
  63.         }
  64.     }}
  65.     {auto char *termset="     !";
  66.         for (i=0;i<=255;i++) {
  67.             if (strchr(termset,i)!=NULL) {
  68.                 term_table2[i]=true;
  69.             }
  70.         }
  71.     }
  72.     {auto char *termset="     ,+*)(<>=/!^@";
  73.         for (i=0;i<=255;i++) {
  74.             if (strchr(termset,i)!=NULL) {
  75.                 term_table3[i]=true;
  76.             }
  77.         }
  78.     }
  79. }
  80. token(char *lin,TOKENS tok,int *ntok,char *outbuff)
  81. {
  82. int i,j,jj;
  83. int tj;
  84. char *cp;
  85. char *p2;
  86.     *ntok = 0;
  87.     in_quote = false;
  88.     if (table_loaded==false) token_init();
  89.     cp = lin;
  90.     cp = find_non_space(cp);
  91.     while (*cp!=0) {
  92.         if (*cp==' ' || *cp=='    ') {
  93.             *cp = ' ';
  94.             cp = find_non_space(cp);
  95.         }
  96.         if (*cp == '!') goto endofline;
  97.         p2 = find_term(cp);
  98.         jj = p2-cp+1;
  99.         if (jj==0) goto endofline;
  100.         add_tok(cp,jj);
  101.         cp = p2 + 1 ;
  102.         if (*ntok>280) subscript();
  103.     }
  104. endofline:;
  105.     if (*ntok>0) {
  106.         if ( (*(*tok)[*ntok])=='\n' ) (*ntok)--;
  107.         if (strcmp((*tok)[*ntok]," ")==0) (*ntok)--;
  108.         if (*ntok>0) p2 =  (*tok)[*ntok] + strlen((*tok)[*ntok])  - 1;
  109.         if (*p2==10) *p2 = 0;
  110.     }
  111. }
  112. /*--------------------------------------------------------------------------*/
  113. char *find_non_space(char *cp)
  114. {
  115.     for ( ; *cp!=0 ; cp++ )  {
  116.         if (*cp!=' ' && *cp!='    ') break;
  117.     }
  118.     return cp;
  119. }
  120. /*--------------------------------------------------------------------------*/
  121. char *find_term(char *cp)
  122. {
  123. char *start;
  124.     start = cp;
  125. /*    if (*cp=='"') {
  126.         cp++;
  127.         for (; *cp!=0 ; cp++ )  {
  128.             if (*cp=='"') break;
  129.         }
  130.         return cp;
  131.     } */
  132.     for (; *cp!=0 ; cp++ )  {
  133.         if (*cp == '"') {
  134.             cp++;
  135.             for (; *cp!=0 ; cp++ )  {
  136.                 if (*cp=='"') if (*(cp-1)!='\\') break;
  137.             }
  138.         }
  139.         if (term_table[*cp]==true) break;
  140.     }
  141.     if (cp>start) return cp-1;
  142.     if (*cp==' ' || *cp=='    ') return cp-1;
  143.     if (*cp==0) return cp-1;
  144.     return cp;
  145. }
  146. /*--------------------------------------------------------------------------*/
  147. int subscript(void)
  148. {
  149.     gprint("Subscript out of range in tokenizer (use shorter lines) \n");
  150. }
  151.  
  152. token_data(char *lin,char *tk[],int *ntok,char *outbuff)
  153. {
  154.     char *s;
  155.     s = strtok(lin," ,=\t\n\x0a\x0c\x0d");
  156.     *ntok = 0;
  157.     for (;s!=NULL;) {
  158.         if (*s == '"' || *s == '!' || *s == ';') goto endofline;
  159.         *ntok += 1;
  160.         strcpy(outbuff,s);
  161.         strupr(outbuff);
  162.         tk[*ntok] = outbuff;
  163.         outbuff = outbuff + strlen(outbuff) + 1;
  164.         s = strtok(NULL," ,=\t\n\x0a\x0c\x0d");
  165.     }
  166. endofline:;
  167.  
  168. }
  169.  
  170.